package com.supermate.supercut.app.constant;

import com.supermate.init.exceptions.SystemException;
import com.supermate.init.util.LogUtil;
import com.supermate.supercut.app.enums.ErrorEnums;
import com.supermate.supercut.app.enums.ExceptionsGetter;
import org.apache.commons.lang3.StringUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.io.IOException;
import java.nio.file.*;

/**
 * @Author: 冰岩
 * @Date: 2023/10/28
 * @Description:
 */
public class AppConstant {

    /**
     * 用户文件的根文件夹名字
     * 部署用户所在目录为/~,则根目录为/~/userFiles
     * 一个zj的剪切板,那么zj剪切板上所有的文件放在/~/usrFiles/zj 目录下
     */
    public static final String USER_FILE_ROOT_DIR = "userFiles";

    /** 用户文件根目录 在 操作系统的绝对路径 */
    public static final Path USER_FILE_ROOT_PATH = initFilesAbsolutePath();

    /** 下载时http链接前缀 */
    public static final String FILE_DOWNLOAD_PREFIX = "https://supercut.icu/userFiles/";

    /**
     * 用户在zj剪切板上上传了图片img.png,系统会生成其在操作系统中的名字,格式为20231029_095512_2345(年月日_时分秒_4位随机数)
     * 数据库里面存的路径是 zj/20231029_095512_2345.png
     * 调用该方法 getFileAbsolutePath("zj/20231029_095512_2345.png") 可以得到操作系统中该文件的实际路径。
     * @param relativePath
     * @return 操作系统中该文件的实际路径
     */
    public static Path getFileAbsolutePath(String relativePath) {
        if (StringUtils.isBlank(relativePath)) {
            throw ExceptionsGetter.getBizException(ErrorEnums.RELATIVE_PATH_EXPECT_NOT_BLANK);
        }
        return USER_FILE_ROOT_PATH.resolve(Paths.get(relativePath));
    }

    /**
     * 根据文件的相对路径，拿到对外的http url， 用于下载。
     * @param relativePath
     * @return
     */
    public static String getFileHttpDownloadLink(String relativePath) {
        return FILE_DOWNLOAD_PREFIX + relativePath;
    }

    private static Path initFilesAbsolutePath() {
        try {
            Path userPath = Paths.get(System.getProperty("user.home"));
            Path filesPath = userPath.resolve(FileSystems.getDefault().getPath(USER_FILE_ROOT_DIR));
            if (!Files.exists(filesPath)) {
                Files.createDirectories(filesPath);
            }
            LogUtil.info("AppConstant#initFilesAbsolutePath root path:",null, filesPath.toString());
            return filesPath;
        } catch (Exception e) {
            LogUtil.error("AppConstant#initFilesAbsolutePath", null, e);
            throw ExceptionsGetter.getSysException(ErrorEnums.INIT_USER_FILE_ROOT_DIR_FAILED);
        }
    }

}
